/* 
 * File:   errno.hpp
 * Author: yuri
 *
 * Created on February 7, 2011, 12:52 AM
 */

#ifndef POSIX_WRAPERS_ERRNO_HPP_____
#define	POSIX_WRAPERS_ERRNO_HPP_____

#include "config.hpp"
#include <errno.h>
#include <stdexcept>
#include <string>

// *****************************************************************************
// * Begin PosixWrap namespace
// *****************************************************************************

BEGIN_PSX_NAMESPACE

// *****************************************************************************
// * class Error
// *****************************************************************************
class Error
: public std::runtime_error
{
  public:
    typedef std::runtime_error inherited;

    Error(); //errno
    explicit Error(int err);
    explicit Error(const std::string& pre); //errno
    Error(const std::string& pre, int err);

    int getErrno() const;

  private:
    const int errno_;

    static std::string getErrorStr(int err);
    static std::string getErrorStr(const std::string& pre, int err);
};

// *****************************************************************************
// * End PosixWrap namespace
// *****************************************************************************

END_PSX_NAMESPACE

// *****************************************************************************
// *****************************************************************************
// * INLINE FUNCTIONS
// *****************************************************************************
// *****************************************************************************

// *****************************************************************************
// * Begin PosixWrap namespace
// *****************************************************************************
BEGIN_PSX_NAMESPACE

// *****************************************************************************
// * class Error
// *****************************************************************************
inline Error::Error()
    : inherited(getErrorStr(errno).c_str()),
      errno_(errno)
{
}

inline Error::Error(int err)
    : inherited(getErrorStr(err).c_str()),
      errno_(err)
{
}

inline Error::Error(const std::string& pre)
    : inherited(getErrorStr(pre, errno).c_str()),
      errno_(errno)
{
}

inline Error::Error(const std::string& pre, int err)
    : inherited(getErrorStr(pre, err).c_str()),
      errno_(err)
{
}

inline int Error::getErrno() const
{
    return errno_;
}

// *****************************************************************************
// * End PosixWrap namespace
// *****************************************************************************
END_PSX_NAMESPACE
#endif	//#ifndef POSIX_WRAPERS_ERRNO_HPP_____
